'''某些网站要求访问者在访问网站内容之前必须先进行登录;若访问者没有该网站的账号,则需要先进行注册.
访问者注册完账号后,网站的服务器会保存账号信息,以便访问者下次访问网站时网站可根据保存的信息验证访问者的身份
.为保障账户安全,访问者可市场修改账号密码,若访问者决定不再访问此网站,可以选择注销账户

本案例要求实现包含用户注册,登录,修改密码和注销功能的用户账户管理程序
(要求程序使用文件存储用户的账户信息).'''
'''
分析:
   用户账户管理程序的具体流程如下所示
   (1) 显示功能菜单:
   (2) 用户选择功能
   (3) 若选择 1,执行用户注册操作.2,执行用户登录操作.3,执行用户注销操作.4,执行修改密码操作.5,执行退出操作
   用户账户管理程序中用户信息是永久存储的,可以保存到本地文件info.txt中.
   实现用户账户管理程序可以编写如下函数实现:
   convert_data():将文件的数据类型转换为字典类型
   regidter():用户注册
   login():用户登录
   cancel():用户注销
   modify():修改密码
   welcom():控制程序的操作流程,包括打印功能菜单,选择功能等
   
'''
# 代码实现
import os
'''
(1) convert_data()
convert_data()用于将用户新信息转换为字典类型的数据,该函数中首先会读取info.txt文件的数据,
然后将数据转换为"姓名:**","密码:**"形式的字典数据.
'''
# 将文件中的数据转换为字典
def convert_data(): #将文件中的字符串数据转换为字典列表
    info_li = []
    with open('info.txt',mode = 'r+',encoding='utf-8') as f:
        info_data = f.readlines() # 读取文件所有行
        for i in info_data: # 遍历每行数据
            info_dict = dict()
            # 替换 { 和 } ,并去掉空格
            step_one = i.replace('{','').replace('}','') # 去大括号
            #以冒号进行分隔
            step_two = step_one.split(':') # 按冒号分割字符串
            # 拼接字典 # 提取姓名和密码
            info_dict['姓名'] = step_two[1].split(',')[0].replace(',','').strip()
            info_dict['密码'] = step_two[2].replace(',','').strip()
            # 保存到列表中
            info_li.append(info_dict)
    return info_li
'''
register()函数用于用户注册,该函数中首先会判断计算机中是否已经有info.txt文件,
没有则创建一个info.txt文件,然后接收用户输入的姓名和密码,并将姓名和密码写入到info.txt
'''
# 注册
def register():
    if os.path.exists('info.txt') is not True:
        with open('info.txt',mode='w',encoding='utf-8') as f:
            f.write('')
    # 用户名列表
    name_li = []
    info_li = convert_data()
    # 接收注册信息
    person_info = {}
    name = input('请输入注册用户名:\n')
    # 获取用户名列表
    for i in info_li:
        name_li.append(i['姓名'])
    # 判断用户是否存在
    if name in name_li:
        print('用户已注册')
    else:
        passward = input('请输入注册密码:\n')
        person_info['姓名'] = name
        person_info['密码'] = passward
        # 写入注册信息
        with open('info.txt',mode='a+',encoding='utf-8') as info_data:
            info_data.write(str(person_info) + '\n')
'''
login()函数用于用户登录,该函数中首先会判断info.txt文件中是否有用户信息,若有用户信息,
则要求用户输入用户名和密码,输入的信息无误登录成功,输入的信息有误登录失败,若没有用户信息,
则提示"当前无数据,请先注册"
'''
# 登录
def login():
    if os.path.exists('info.txt') is not True:
        print('当前无数据,请先注册')
    else:
        # 用户名列表
        name_li = []
        info_li = convert_data()
        name = input('请输入登录用户名:\n')
        password = input('请输入登录密码:\n')
        # 获取用户名列表
        for i in info_li:
            name_li.append(i['姓名'])
        # 判断用户是否存在
        if name in name_li:
            # 获取修改用户的索引
            modify_index = name_li.index(name)
            # 判断密码是否正确
            if password == info_li[modify_index]['密码']:
                print('登录成功')
            else:
                print('用户名或密码不正确')
        else:
            print('用户名或密码不正确')
'''
cancel()函数用于用户注销,该函数中首先会判断info.txt文件中是否有用户信息,若有用户信息,
则要求用户输入要注销的用户名和密码,输入的信息无误注销成功,输入的信息有误会提示"用户名或者密码不正确"
若没有用户信息,则提示"注销的用户不存在"
'''
# 注销
def cancel():
    if os.path.exists('info.txt') is not True:
        print('当前无数据,请先注册')
    else:
        cancel_name = input('请输入注销的用户:\n')
        cancel_password = input('请输入密码\n')
        # 用户名列表
        name_li = []
        info_li = convert_data()
        for i in info_li:
            name_li.append(i['姓名'])
        if cancel_name in name_li:
            # 获取注销用户的索引
            cancel_index = name_li.index(cancel_name)
            # 判断输入的密码是否正确
            if cancel_password == info_li[cancel_index]['密码']:
                info_li.pop(cancel_index)
                # 写入空数据
                with open('info.txt',mode='w+',encoding='utf-8') as f:
                    f.write('')
                for i in info_li:
                    with open('info.txt',mode = 'a+',encoding = 'utf-8') as info_data:
                        info_data.write(str(i) + '\n')
                print('用户注销成功')
            else:
                print('注销的用户不存在')
'''
modify()函数用于修改密码,该函数中首先会判断info.txt文件中是否有用户信息,若有用户信息,
则要求用户输入要修改的用户名和旧密码,输入的信息判断无误后设置新密码,若没有用户信息,则提示注销的用户不存在
'''
# 修改密码
def modify():
    if os.path.exists('info.txt') is not True:
        print('当前无数据,请先注册')
    else:
        # 用户名列表
        name_li = []
        info_li = convert_data()
        modify_name = input('请输入用户名\n')
        password = input('请输入旧密码:\n')
        # 获取用户名列表
        for i in info_li:
            name_li.append(i['姓名'])
        # 判断用户名是否存在
        if modify_name in name_li:
            # 获取修改密码用户的索引
            modify_index = name_li.index(modify_name)
            # 判断密码是否正确
            if password == info_li[modify_index]['密码']:
                # 修改密码
                new_password = input('请输入新密码:\n')
                info_li[modify_index]['密码'] = new_password
                with open('info.txt',mode = 'w+',encoding = 'utf-8') as f:
                    f.write('')
                for i in info_li:
                    with open('info.txt',mode='a+',encoding='utf-8') as info_data:
                        info_data.write(str(i)+'\n')
            else:
                print('用户名或密码不正确')
        else:
            print('用户名或密码不正确')
'''
welcom()函数用于控制用户账户管理程序的流程,该函数中会先显示功能菜单,再根据用户的输入调用以上定义的函数
实现相应的功能
'''
def welcom():
    print('欢迎使用账户管理程序')
    print('1.用户注册')
    print('2.用户登录')
    print('3.用户注销')
    print('4.修改密码')
    print('5.退出')
    while True:
        option = input('请选择功能:\n')
        # 用户注册
        if option == '1':
            register()
        # 用户登录
        elif option == '2':
            login()
        # 注销
        elif option == '3':
            cancel()
        # 修改密码
        elif option == '4':
            modify()
        # 退出
        elif option == '5':
            break
'''调用welcom()函数'''
if __name__ == '__main__':
    welcom()
